package com.cn.wanxi.util;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.List;

public class Upload {
    public static void file(HttpServletRequest req) {
        // 获得磁盘文件条目工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 如果没以下两行设置的话，上传大的 文件 会占用 很多内存，
        // 设置暂时存放的 存储室 , 这个存储室，可以和 最终存储文件 的目录不同
        /**
         * 原理 它是先存到 暂时存储室，然后在真正写到 对应目录的硬盘上， 按理来说 当上传一个文件时，其实是上传了两份，第一个是以
         * .tem 格式的 然后再将其真正写到 对应目录的硬盘上
         */
//        factory.setRepository(new File(TEMP_FOLDER));
        // 设置 缓存的大小，当上传文件的容量超过该缓存时，直接放到 暂时存储室
        factory.setSizeThreshold(1024 * 1024);

        // 高水平的API文件上传处理,解析文件
        ServletFileUpload upload = new ServletFileUpload(factory);

        // 提交上来的信息都在这个list里面
        // 这意味着可以上传多个文件
        // 请自行组织代码
        List<FileItem> list = null;
        try {
            list = upload.parseRequest(req);
        } catch (FileUploadException ex) {
            ex.printStackTrace();
        }

        // 获取上传的文件
        for (FileItem file : list) {
            FileItem item = file;
            // 获取文件名{name:"fadsdas",price:"24132"}
            System.out.println(item.getFieldName());
//            String key = item.getFieldName();
            System.out.println(item.getName());
            String name = item.getName();

            // 保存后的文件名  1234564564----a.jpg
            String fileName = System.currentTimeMillis() + "---" + name;
            String temp = req.getServletContext().getRealPath("/");
            System.out.println(temp);
            String path = temp.split("out")[0] + "/web/";
            String derectory = "/loadimg/";
//            String path = "D:\\wanxi\\step-4\\canyin04-0315\\web\\img";
            // 真正写到磁盘上
//            File aa = new File(path, derectory);
//            文件夹不存在则创建文件夹
            File aa = IO.createDerectory(path + derectory);
            try {
                File tempFile = new File(aa, fileName);

//                File newFile = new File(temp + derectory, fileName);

                item.write(tempFile); // 第三方提供的
//                item.write(new File(temp, fileName));
                File newFile = IO.createDerectory(temp + derectory);
                copy(tempFile, new File(newFile, fileName));
                req.setAttribute("imgHref", derectory + fileName);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 将file的文件复制到新 地址
     *
     * @param file
     * @param newFile
     */
    private static void copy(File file, File newFile) {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            OutputStream outputStream = new FileOutputStream(newFile);
            int lon = 0;
            while ((lon = inputStream.read()) != -1) {
                outputStream.write(lon);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
